package cn.wolfcode._05orderly;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;

import java.util.Date;
import java.util.List;

/**
 * 顺序消息
 */
//生产者----------
public class Producer {
    public static void main(String[] args) throws Exception {
        // 实例化消息生产者Producer
        DefaultMQProducer producer = new DefaultMQProducer("wolfcode_producer-sunxu");
        // 设置NameServer的地址
        producer.setNamesrvAddr("192.168.204.128:9876"); // 注意修改为服务所在的电脑ip
        // 启动Producer实例
        producer.start();
        List<OrderStep> orderSteps = OrderUtil.buildOrders(); //生成模拟订单数据

        MessageQueueSelector selector = new MessageQueueSelector() {
            /**
             * @param list 映射服务器上的队列，是一个集合，默认有四个对列
             * @param message 此时发送的消息本身
             * @param o 在 producer.sendOneway(msg, selector, step.getOrderId()); 传入的第三个参数 orderId
             * @return MessageQueue对象，最终会将消息发送到该队列中
             */
            public MessageQueue select(List<MessageQueue> list, Message message, Object o) {
                System.out.println("对列个数：" + list.size());
                Long orderId = (Long) o;
                // 同一个订单id 的任务需要放入到同一个队列中，订单id是一样的，可以根据订单id进行对列长度求模取余
                int index = (int) (orderId % list.size());
                return list.get(index);
            }
        };
        for (OrderStep step : orderSteps) {
            // 创建消息，并指定Topic，Tag和消息体
            Message msg = new Message("orderTopic",step.toString().getBytes());
            // 发送改消息的时候，先调用选择器的方法，选择需要发送到那一个队列中
            producer.sendOneway(msg, selector, step.getOrderId());
        }

        System.out.println("消息发送完成");
        producer.shutdown();
    }
}